home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / ada_pcdp / ada / pcs.ada < prev    next >
Text File  |  1996-01-30  |  1KB  |  63 lines

  1. with Text_IO; use Text_IO;
  2. with Semaphore_Package; use Semaphore_Package;
  3. procedure PCS is
  4.  
  5.   N: constant Integer := 10;
  6.   B: array(0..N-1) of Integer;
  7.   In_Ptr, Out_Ptr: Integer := 0;
  8.  
  9.   Elements: Semaphore := Init(0);
  10.   Spaces:   Semaphore := Init(N);
  11.  
  12.   task Producer is
  13.     pragma Priority(10);
  14.   end Producer;
  15.   task Consumer1 is
  16.     pragma Priority(7);
  17.   end Consumer1;
  18.   task Consumer2 is
  19.     pragma Priority(7);
  20.   end Consumer2;
  21.  
  22.   task body Producer is
  23.     I: Integer := 0;
  24.   begin
  25.     loop
  26.       I := I + 1;
  27.       Put_Line("Produce   " & Integer'Image(I));
  28.       if I mod 40 = 0 then delay 1.0; end if;
  29.       Wait(Spaces);
  30.       B(In_Ptr) := I;
  31.       In_Ptr := (In_Ptr + 1) mod N;
  32.       Signal(Elements);
  33.     end loop;
  34.   end Producer;
  35.  
  36.   task body Consumer1 is
  37.     I: Integer;
  38.   begin
  39.     loop
  40.       Wait(Elements);
  41.       I := B(Out_Ptr);
  42.       Out_Ptr := (Out_Ptr + 1) mod N;
  43.       Signal(Spaces);
  44.       Put_Line("Consume 1 " & Integer'Image(I));
  45.     end loop;
  46.   end Consumer1;
  47.  
  48.   task body Consumer2 is
  49.     I: Integer;
  50.   begin
  51.     loop
  52.       Wait(Elements);
  53.       I := B(Out_Ptr);
  54.       Out_Ptr := (Out_Ptr + 1) mod N;
  55.       Signal(Spaces);
  56.       Put_Line("Consume 2 " & Integer'Image(I));
  57.     end loop;
  58.   end Consumer2;
  59.  
  60. begin
  61.   null;
  62. end PCS;
  63.